给定仅包含“()[]{}”六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。。

输入格式:

第一行一个整数T(T<=10)

其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)

输出格式:

对于每个字符串,匹配输出Yes,否则输出No

输入样例:

1
2
3
2
{()[]}
([)]

输出样例:

1
2
Yes
No

思路

使用stack来存储符号,遇左压栈,如果为右括号判断是否与当前栈顶元素相匹配,若不匹配则为“No”,匹配则弹出当前栈顶元素(左括号),继续进行下一个括号匹配。最后为空栈则为“Yes”。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <stack>
using namespace std;
bool com(char a, char b) {
if ((a == '{' && b == '}') || (a == '[' && b == ']') || (a == '(' && b == ')'))
return true;
return false;
}
int main() {
int n;
cin >> n;
getchar();
for (int i = 0; i < n; i++) {
stack<char> s;
string m;
getline(cin, m);
for (int j = 0; j < m.size(); j++) {
char c = m[ j ];
if (!s.empty()) {
if (com(s.top(), c)) {
s.pop();
continue;
}
}
s.push(c);
}
if (!s.empty())
cout << "No" << endl;
else
cout << "Yes" << endl;
}
}